package br.com.pentagrama.service.impl;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import br.com.pentagrama.service.ILog;

public class LogImpl implements ILog {

	private static Logger LOGGGER = Logger.getLogger("Applet");
	
	private static boolean DEBUG = true;
	
	private static LogImpl instance;
	
	private StringBuffer buffer;
	
	private List<String> lista = new ArrayList<String>();
	
	/**
	 * Método "get" para o atributo lista.
	 *
	 * @return Atributo lista
	 */
	public List<String> getLista() {
		return lista;
	}

	/**
	 * Método "set" para o atibuto lista.
	 *
	 * @param lista utilizado para atualizar o atributo: lista
	 */
	public void setLista(List<String> lista) {
		this.lista = lista;
	}

	public static LogImpl getInstance() {
		if(instance == null) {
			instance = new LogImpl();
		}
		return instance;
	}
	
	private LogImpl() {
		limpar();
	}
	
	
	

	public void debug(Level level, String texto) {
		if(DEBUG) {
			LOGGGER.log(level, texto);
		}
	}
	
	public void debug(Level level, String texto, Throwable t) {
		if(DEBUG) {
			LOGGGER.log(level, texto, t);
		}
	}
	
	public void limpar() {
		buffer = new StringBuffer();
		lista.clear();
	}

	public void info(String texto) {
		String string = "[INFO] " + texto;
		escrever(string);
		lista.add(string);
		debug(Level.INFO, texto);
	}
	
	public void alerta(String texto) {
		String string = "[ALERTA] " + texto;
		escrever(string);
		lista.add(string);
		debug(Level.WARNING, texto);
	}
	
	public void erro(String texto) {
		String string = "[ERRO] " + texto;
		escrever(string);
		lista.add(string);
		debug(Level.SEVERE, texto);
	}
	
	public void erro(String texto, Throwable throwable) {
		escrever("[ERRO] " + texto);
		for(StackTraceElement stack :throwable.getStackTrace()) {
			escrever("[ERRO] " + stack.toString());
		}
		LOGGGER.log(Level.SEVERE, texto, throwable);
	}
	
	public void escrever(String texto) {
		buffer.append(texto);
		buffer.append("\n");
	}

	public String ler() {
		return buffer.toString();
	}

	public String gerarArquivo() {
		try {
			SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd_HHmm");
			String data = format.format(new Date());
			String nomeArquivo = "testeConexao" + data + ".txt";
			
			String property = "java.io.tmpdir";
		    String tempPath = System.getProperty(property);
		    
			File tempDir = new File(tempPath);
			File parent = new File(tempDir,"TesteConexao");
			try {
				parent.mkdir();
			} catch (Exception e) {
				LOGGGER.log(Level.SEVERE, "Erro ao criar diretório TesteConexao", e);
			}
			
			File file = new File(parent, nomeArquivo);
			RandomAccessFile raf = new RandomAccessFile(file, "rw");
			raf.seek(0);
			raf.write(ler().getBytes());
			raf.close();	
			return file.getAbsolutePath();
		} catch (IOException e) {
			LOGGGER.log(Level.SEVERE, "Erro ao gerar relatório", e);
			throw new RuntimeException(e);
		}
	}
	
}
